class: center, middle, inverse, title-slide # FORECAST HARGA GULA ## Sebuah Analisa Time Series ### ikanx101.github.io ###
@mr.ikanx
### Juni 30, 2020 --- class: middle,center # Pendahuluan --- # Pendahuluan ## Latar Belakang ### Perubahan Harga Bahan Baku Salah satu bahan baku yang digunakan oleh Nutrifood adalah gula. Jika diperhatikan, harga gula dunia selalu berubah setiap harinya. Perkembangan teknologi dan metodologi _data science_ saat ini memungkinkan kita untuk bisa mengambil data historikal secara _real time_ dan membuat model prediksi dari data tersebut. ## Tujuan Apakah bisa kita memodelkan dan memprediksi perubahan harga gula di masa yang akan datang? --- # Pendahuluan ## Landasan Teori ### Mengenal _Time Series_ Setiap data yang berkaitan dengan waktu, dapat digolongkan menjadi deret waktu (_time series_). Biasa dinotasikan sebagai `\(Y_t\)`. Ada dua analisa yang sangat populer terkait dengan _time series_: - _Forecasting_ model, seperti: _Exponential smoothing_, _ARIMA_, dll. - _Decomposition_. --- class: middle,center # Metodologi --- # Metodologi ## Data dan Analisa Data yang digunakan diambil dari situs [isosugar](https://www.isosugar.org/prices.php?pricerange=currentmonth). Harga yang diambil adalah dalam kurs _dollar_, yakni: __cts/lb__. Data yang tersedia adalah data harga gula harian sejak dari `Januari 2017` hingga `Juni 2020`. Data diambil dengan cara _web scraping_. Data akan dibagi dua, yakni `train dataset` untuk membuat model _forecast_ (data `Januari 2017` hingga `Mei 2020`) dan `test dataset` (data `Juni 2020`) untuk melakukan validasi model. Semuanya dilakukan dengan _tools_ __R__.
--- # Metodologi ## _Missing data_ `NA` Dari data harian yang ada tersebut, ternyata pada saat hari libur (termasuk sabtu dan minggu) tidak ada data harga (kosong atau `NA`). Oleh karena itu, data kosong ini akan diisi harga pada hari sebelumnya (misal: _closing_ harga Jumat atau kondisi lainnya). --- class: middle,center # Analisa _Time Series_ --- # Analisa _Time Series_ ## Tren Harga Gula
--- # Analisa _Time Series_ ## _Stationary Checking_ Salah satu syarat agar kita bisa membangun model _forecast_ dari data _time series_ adalah: > Data yang digunakan harus __stationary__. Bagaimana cara mengeceknya? ``` ## ## Augmented Dickey-Fuller Test ## ## data: ts ## Dickey-Fuller = -3.1252, Lag order = 10, p-value = 0.102 ## alternative hypothesis: stationary ``` ``` ## [1] "Tidak stationary" ``` --- # Analisa _Time Series_ ## _Stationary Checking_ Ternyata data yang kita miliki tidak stasioner sehingga perlu ada transformasi agar menjadi stasioner. Caranya adalah dengan membuat data _time series_ baru dengan membuat data baru, yakni data selisih harga dengan `lag = n hari`. Bagaimana mencari nilai `n`? Kita bisa melakukan analisa `ndiffs` sehingga mendapatkan nilai `lag` terbaik. ```r ndiffs(ts, alpha=0.05, test=c('kpss')) ``` ``` ## [1] 1 ``` Sehingga didapat `lag = 1` hari. --- # Analisa _Time Series_ ## Membuat Data Baru Setelah mengetahui `lag`, maka kita akan membuat data baru sebagai berikut: `$$Y_t' = Y_{t(i+1)} - Y_t$$` Yakni: data esok dikurang data sekarang. Bagaimana hasil transformasinya?
--- # Analisa _Time Series_ ## _Stationary Checking_ untuk Data Baru Mari kita cek apakah data hasil transformasinya sudah stasioner atau belum! ``` ## ## Augmented Dickey-Fuller Test ## ## data: ts_transformed ## Dickey-Fuller = -10.227, Lag order = 10, p-value = 0.01 ## alternative hypothesis: stationary ``` ``` ## [1] "stationary" ``` Ternyata hasilnya stasioner. Berarti kita bisa membuat model _forecast_ berdasarkan data hasil transformasi ini. --- # Analisa _Time Series_ ## _Decomposition_ Mari kita lihat dulu bagaimana jika data ini kita dekomposisi menggunakan metode [STL](https://otexts.com/fpp2/stl.html#ref-Cleveland1990). <img src="Presentasi-Gula_files/figure-html/unnamed-chunk-7-1.png" width="1008" /> --- class:middle,center # _Forecast_ Model --- # _Forecast_ Model Kita akan membuat model untuk _forecast_ harga gula. Agar bisa melakukan _cross validation_, data akan kita pecah menjadi dua, yakni: 1. `train` _dataset_, yakni berisi data selisih harga gula `Januari 2017` - `Mei 2020`. 2. `test` _dataset_, yakni data harga gula pada `Maret 2020` agar kita bisa menilai _performance_ dari model yang kita buat. ### _Train dataset_
--- # _Forecast_ Model ### _Test dataset_
Kita akan membuat beberapa model _time series_, model yang terbaik akan dipilih berdasarkan validasi dengan `test` _dataset_. --- # _Forecast_ Model ## Metode yang Digunakan Dalam melakukan _forecast time series_ kita bisa menggunakan beberapa metode yang ada. Pada kasus kali ini, kita membuat model berdasarkan metode sebagai berikut: 1. ARIMA. 2. Exponential Smoothing 3. Auto ARIMA 4. Holtwinter 5. Naive 6. TBATS Model terbaik akan dipilih berdasarkan parameter _goodness of fit model_. Parameter yang dipilih adalah `MAE` (_Mean Absolute Error_). `$$MAE = \frac{1}{n} \sum_{n=1}^{n} |predict_i - actual_i|$$` --- --- # _Forecast_ Model ## _Goodness of Fit Parameter_: __MAE__ `$$MAE = \frac{1}{n} \sum_{n=1}^{n} |predict_i - actual_i|$$` `MAE` menandakan nilai mutlak dari kesalahan (_error_) antara nilai prediksi dengan nilai aktual. Semakin kecil `MAE` yang didapatkan, maka akan semakin bagus prediksi dari model tersebut. --- # _Forecast_ Model ## Model I: ARIMA
``` ## ME RMSE MAE MPE MAPE MASE ACF1 ## Training set -1.310490e-06 0.1467468 0.1077438 NaN Inf 0.6122437 7.803934e-06 ## Test set 6.492807e-02 0.1803928 0.1472824 NaN Inf 0.8369185 2.595380e-01 ## Theil's U ## Training set NA ## Test set NaN ``` --- # _Forecast_ Model ## Model II: Exponential Smoothing
``` ## ME RMSE MAE MPE MAPE MASE ACF1 ## Training set 0.0001352459 0.1467556 0.1077333 NaN Inf 0.6121839 -0.004552901 ## Test set 0.0648734765 0.1803369 0.1472419 NaN Inf 0.8366881 0.259331596 ## Theil's U ## Training set NA ## Test set NaN ``` --- # _Forecast_ Model ## Model III: Auto ARIMA
``` ## ME RMSE MAE MPE MAPE MASE ACF1 ## Training set -0.006444623 0.1805340 0.1122071 100 100 0.6376059 0.03225974 ## Test set 0.037200000 0.1529575 0.1132000 100 100 0.6432482 0.22686399 ## Theil's U ## Training set NA ## Test set 0 ``` --- # _Forecast_ Model ## Model IV: HOLTWINTER
``` ## ME RMSE MAE MPE MAPE MASE ACF1 ## Training set -0.004979076 0.1996018 0.1288276 NaN Inf 0.7320503 -0.03177781 ## Test set 0.029275503 0.1817446 0.1431988 NaN Inf 0.8137137 0.26008797 ## Theil's U ## Training set NA ## Test set NaN ``` --- # _Forecast_ Model ## Model V: NAIVE
``` ## ME RMSE MAE MPE MAPE MASE ACF1 Theil's U ## Training set 0.0000 0.2511023 0.1734297 NaN Inf 0.9854978 -0.4792217 NA ## Test set 0.0372 0.1529575 0.1132000 100 100 0.6432482 0.2268640 0 ``` --- # _Forecast_ Model ## Model VI: TBATS
``` ## ME RMSE MAE MPE MAPE MASE ACF1 ## Training set -0.001409578 0.1788000 0.1139979 NaN Inf 0.6477823 0.0203567 ## Test set 0.045433505 0.1551474 0.1161518 Inf Inf 0.6600212 0.2266743 ## Theil's U ## Training set NA ## Test set NaN ``` --- # _Forecast_ Model ## Model yang Dipilih <table> <caption>Rangkuman Akurasi Model</caption> <thead> <tr> <th style="text-align:left;"> Metode </th> <th style="text-align:right;"> MAE </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Auto ARIMA </td> <td style="text-align:right;"> 0.1132 </td> </tr> <tr> <td style="text-align:left;"> Naive </td> <td style="text-align:right;"> 0.1132 </td> </tr> <tr> <td style="text-align:left;"> TBATS </td> <td style="text-align:right;"> 0.1162 </td> </tr> <tr> <td style="text-align:left;"> Holtwinter </td> <td style="text-align:right;"> 0.1432 </td> </tr> <tr> <td style="text-align:left;"> Exponential Smoothing </td> <td style="text-align:right;"> 0.1472 </td> </tr> <tr> <td style="text-align:left;"> ARIMA </td> <td style="text-align:right;"> 0.1473 </td> </tr> </tbody> </table> Dibandingkan dengan metode lain yang memiliki MAE rendah, metode Holtwinter memberikan prediksi yang tak singular.